
#include "nane/SerializeSystem/DeserializationProtocol.h"

namespace nane
{
    ////////////////////////////////////////////////////////////////////////////////////////////////
    template<bool StrictOrder>
    DeserializationProtocol<StrictOrder>::DeserializationProtocol()
    {

    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    template<bool StrictOrder>
    DeserializationProtocol<StrictOrder>::~DeserializationProtocol()
    {
        for( std::vector<DeserializationTypeBase*>::iterator it = m_handlers.begin(), it_end = m_handlers.end();
                it != it_end;
                ++it )
        {
            (*it)->Release();
        }
        m_handlers.clear();
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    template<>
    template<typename T>
    bool DeserializationProtocol<false>::SerializeImpl_( const char* _tag, T _data )
    {
        bool deserialized = false;
        for( std::vector<DeserializationTypeBase*>::iterator it = m_handlers.begin(), it_end = m_handlers.end();
                it != it_end;
                ++it )
        {
            deserialized = (*it)->Serialize(_tag, _data) || deserialized;
        }
        return deserialized;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    template<>
    template<typename T>
    bool DeserializationProtocol<true>::SerializeImpl_( const char* _tag, T _data )
    {
        return false;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    template<>
    bool DeserializationProtocol<false>::Serialize( const char* _tag )
    {
        bool deserialized = false;
        for( std::vector<DeserializationTypeBase*>::iterator it = m_handlers.begin(), it_end = m_handlers.end();
                it != it_end;
                ++it )
        {
            deserialized = deserialized || (*it)->Serialize(_tag);
        }
        return deserialized;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    template<>
    bool DeserializationProtocol<true>::Serialize( const char* _tag )
    {
        return false;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    template<bool StrictOrder>
    bool DeserializationProtocol<StrictOrder>::Serialize( const char* _tag, int32 _data )
    {
        return SerializeImpl_(_tag, _data);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    template<bool StrictOrder>
    bool DeserializationProtocol<StrictOrder>::Serialize( const char* _tag, uint32 _data )
    {
        return SerializeImpl_(_tag, _data);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    template<bool StrictOrder>
    bool DeserializationProtocol<StrictOrder>::Serialize( const char* _tag, float _data )
    {
        return SerializeImpl_(_tag, _data);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    template<bool StrictOrder>
    bool DeserializationProtocol<StrictOrder>::Serialize( const char* _tag, bool _data )
    {
        return SerializeImpl_(_tag, _data);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    template<bool StrictOrder>
    bool DeserializationProtocol<StrictOrder>::Serialize( const char* _tag, const char* _data )
    {
        return SerializeImpl_(_tag, _data);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    template class DeserializationProtocol<true>;
    template class DeserializationProtocol<false>;
    ////////////////////////////////////////////////////////////////////////////////////////////////
}
